feat(bundles): create lfx-bundles metapackage skeleton#13564
Conversation
Creates the manifest-less lfx-bundles distribution (the langchain-community model) that the long-tail providers will move into. Empty skeleton for now; the bulk move (scripts/migrate/consolidate_bundles.py) populates the provider folders + per-provider extras later. - src/bundles/lfx-bundles: a single pyproject declaring the lfx.bundles entry-point (lfx_bundles = "lfx_bundles"), an lfx>=1.10.0,<2.0.0 pin, and a generated (currently empty) `all` extra; plus a bare lfx_bundles namespace package and a README documenting the model + install stories - wired into the root workspace via the existing bundle marker blocks: dep lfx-bundles[all]>=1.0,<2.0, uv source, and member - hyphen dir name so release.yml's src/bundles/*/pyproject.toml glob builds it with zero workflow change Verified: the wheel builds (entry_points.txt carries the lfx.bundles group); load_lfx_bundles_extensions (PR-1) discovers the entry point and the empty skeleton registers zero providers with no error.
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. 🗂️ Base branches to auto review (1)
Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Two gaps in update_bundle_versions.py around extras suffixes, both fatal or silently wrong for the first nightly carrying the lfx-bundles metapackage: - update_root_pyproject_for_bundle's dep regex required the version specifier immediately after the name, so "lfx-bundles[all]>=1.0,<2.0" (a MAIN dep) was left unrewritten while the workspace member was renamed to lfx-bundles-nightly; uv lock then tries to resolve stable lfx-bundles from PyPI, where it does not exist. The same gap silently left "lfx-docling[local]>=0.1.0" optional-dep refs pointing at the stable distribution. The regex now tolerates an [extras] group and carries it into the replacement. - rename_bundle_pyproject skipped self-referencing extras, so the metapackage's generated `all` extra kept 45 "lfx-bundles[<provider>]" members after the rename, pulling the stable distribution (same lfx_bundles import package, install collision) once published. Self refs now follow the rename, idempotently. Tests drive the real script module, mirroring test_bundle_lfx_pin.py. This closes the PR-2 audit item flagged when the metapackage was introduced. The canonical-pre-release cutover would retire the nightly rename entirely; until it lands, the rename must be correct.
✅ Test Coverage AdvisorNo source changes detected without accompanying tests. Thanks for keeping coverage up! 🎉
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## bundles/foundation-discovery #13564 +/- ##
================================================================
- Coverage 58.38% 49.17% -9.21%
================================================================
Files 2304 2160 -144
Lines 220032 206714 -13318
Branches 34163 13109 -21054
================================================================
- Hits 128456 101649 -26807
- Misses 90121 103609 +13488
- Partials 1455 1456 +1
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
ogabrielluiz
left a comment
There was a problem hiding this comment.
Hey @erichare,
Notes are inline.
| # would resolve the stable distribution from PyPI -- which ships the same | ||
| # import package and collides at install time -- or fail to resolve | ||
| # entirely while the stable name is unpublished. Idempotent on re-runs. | ||
| self_ref_pattern = re.compile(rf'"{re.escape(base_name)}(?:-nightly)?(\[[^\]]*\])') |
There was a problem hiding this comment.
Does this script still have a caller? #13206 dropped the update_bundle_versions.py invocation from nightly_build.yml, NIGHTLY.md says bundles keep their stable names during nightly bumps, and grep finds no workflow or Makefile target invoking it now. The new test file's docstring also says "The nightly build calls this script", which isn't true anymore. If the rename track is coming back for the metapackage this needs the workflow wiring, otherwise I think the script and the new tests should go rather than grow.
There was a problem hiding this comment.
Good catch — confirmed: no workflow or Makefile target on main or any release branch invokes it (the only remaining hits were doc comments). The rename track isn't coming back (Approach A / NIGHTLY.md retired it), so I deleted the script and the new tests in e887249, and updated the stale references in sync_bundle_lfx_pin.py / test_bundle_lfx_pin.py that pointed at it.
| ```bash | ||
| pip install langflow # everything (langflow pins lfx-bundles[all]) | ||
| pip install lfx # engine only, no bundles | ||
| pip install "lfx[bundles]" # engine + this metapackage (deployment footnote) |
There was a problem hiding this comment.
Neither of these commands works yet: lfx has no bundles extra (no optional-dependencies table at all), and the only extra here is the empty all, so lfx-bundles[tavily] installs with a no-such-extra warning and none of the provider deps (I tried it with uv pip install --dry-run). Since this README ships as the PyPI page, could you mark these as the post-bulk-move state or drop them until then?
There was a problem hiding this comment.
You're right — fixed in e887249. The install section now separates what works today (pip install langflow, bare lfx) from what arrives later (lfx[bundles] ships with the engine-only split in PR 3; per-provider extras land with the bulk move), and notes the generated all extra is empty until the first provider tranche moves in.
| # depends on (``lfx-bundles[all]``) so ``pip install langflow`` stays | ||
| # functionally identical to today. | ||
| dependencies = [ | ||
| "lfx>=1.11.0.dev0,<2.0.0", |
There was a problem hiding this comment.
The PR body says this declares an lfx>=1.10.0,<2.0.0 pin, but the code has >=1.11.0.dev0, which I think is the right one (it's what sync_bundle_lfx_pin.py generates for lfx 1.11.0). Could you update the body?
There was a problem hiding this comment.
Updated the PR body — it now states the actual lfx>=1.11.0.dev0,<2.0.0 pin (the pre-release-safe floor sync_bundle_lfx_pin.py generates for the 1.11 line) and also mentions the update_bundle_versions.py removal from the other thread.
…ript, fix README install stories - Delete scripts/ci/update_bundle_versions.py and its tests: the nightly bundle-rename track it served was retired by the canonical pre-release cutover (src/bundles/NIGHTLY.md) and no workflow or Makefile target on main or any release branch invokes it. Stale doc references in sync_bundle_lfx_pin.py and test_bundle_lfx_pin.py updated to match. - README: split the install section into what works today (langflow, bare lfx) vs what arrives with the bulk move / engine-only split (lfx[bundles], per-provider lfx-bundles[<provider>] extras), and note the generated all extra is empty until the first provider tranche lands.
Bundle Separation Phase A — PR 2: lfx-bundles skeleton
Part of Bundle Separation Phase A — metapackage split (1.11). Stacked on the foundation PR (
bundles/foundation-discovery).What this does
Creates the manifest-less
lfx-bundlesdistribution that the long-tail providers will move into. Empty skeleton for now — the bulk move (scripts/migrate/consolidate_bundles.py, a later PR) populates the provider folders + per-provider extras.src/bundles/lfx-bundles/: a singlepyproject.tomldeclaring thelfx.bundlesentry-point (lfx_bundles = "lfx_bundles"), anlfx>=1.11.0.dev0,<2.0.0pin (the pre-release-safe floorsync_bundle_lfx_pin.pygenerates for the 1.11 line), and a generated (currently empty)allextra; a barelfx_bundles/__init__.pynamespace package; and a README documenting the model + install stories.lfx-bundles[all]>=1.0,<2.0, uv source, member.lfx-bundles) sorelease.yml'ssrc/bundles/*/pyproject.tomlglob builds it with zero workflow change.scripts/ci/update_bundle_versions.py(and drops the tests this PR had added for it): the nightly bundle-rename track it served was retired by the canonical pre-release cutover (seesrc/bundles/NIGHTLY.md) and nothing invokes the script on main or any release branch. Stale doc references insync_bundle_lfx_pin.py/test_bundle_lfx_pin.pyupdated accordingly.Test plan
uv syncresolves + installslfx-bundles==1.0.0entry_points.txtcarries thelfx.bundlesgroupload_lfx_bundles_extensions()(foundation PR) discovers the entry point and the empty skeleton registers zero providers with no errorStack (merge bottom-up)
bundles/foundation-discovery→feat/bundle-metapackage-split(foundation)bundles/create-lfx-bundles→bundles/foundation-discovery← this PRbundles/lfx-engine-only→bundles/create-lfx-bundles(engine-only)